home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / modules / saveilbm.c < prev    next >
C/C++ Source or Header  |  1992-05-18  |  5KB  |  171 lines

  1. /* saveilbm.c 04/92  C. Scheppner CBM
  2.  *
  3.  * High-level ILBM save routines
  4.  */
  5. #define INTUI_V36_NAMES_ONLY
  6.  
  7. #include "iffp/ilbm.h"
  8. #include "iffp/ilbmapp.h"
  9.  
  10. extern struct Library *GfxBase;
  11.  
  12. /* screensave.c
  13.  *
  14.  * Given an ILBMInfo with a  currently available (not in use)
  15.  *   ParseInfo->iff IFFHandle, a screen pointer, filename, and
  16.  *   optional chunklist, will save screen as an ILBM
  17.  * The struct Chunk *chunklist1 and 2 are for chunks you wish written
  18.  * out other than BMHD, CMAP, and CAMG (they will be screened out
  19.  * because they are computed and written separately).
  20.  *
  21.  * Note -  screensave passes NULL for transparent color and mask
  22.  *
  23.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  24.  */
  25. LONG screensave(struct ILBMInfo *ilbm,
  26.             struct Screen *scr,
  27.             struct Chunk *chunklist1, struct Chunk *chunklist2,
  28.             UBYTE *filename)
  29. {
  30. extern struct Library *GfxBase;
  31. UWORD *colortable, count;
  32. ULONG modeid;
  33. LONG error;
  34. int k;
  35.  
  36.     if(GfxBase->lib_Version >= 36)
  37.     modeid=GetVPModeID(&scr->ViewPort);
  38.     else
  39.     modeid = scr->ViewPort.Modes & OLDCAMGMASK;
  40.  
  41.     count = scr->ViewPort.ColorMap->Count;
  42.     if(colortable = (UWORD *)AllocMem(count << 1, MEMF_CLEAR))
  43.     {
  44.     for(k=0; k<count; k++)    colortable[k]=GetRGB4(scr->ViewPort.ColorMap,k);
  45.  
  46.         error = saveilbm(ilbm, &scr->BitMap, modeid,
  47.         scr->Width, scr->Height, scr->Width, scr->Height,
  48.         colortable, count, 4,
  49.         mskNone, 0,
  50.         chunklist1, chunklist2, filename);
  51.     FreeMem(colortable,count << 1);
  52.     }
  53.     else error = IFFERR_NOMEM;
  54.     return(error);
  55. }
  56.  
  57.  
  58. /* saveilbm
  59.  *
  60.  * Given an ILBMInfo with a currently available (not-in-use)
  61.  *   ParseInfo->iff IFFHandle, a BitMap ptr,
  62.  *   modeid, widths/heights, colortable, ncolors, bitspergun,
  63.  *   masking, transparent color, optional chunklists, and filename,
  64.  *   will save the bitmap as an ILBM.
  65.  *
  66.  *  if bitspergun=4,  colortable is words, each with nibbles 0RGB
  67.  *  if bitspergun=8,  colortable is byte guns of RGBRGB etc. (like a CMAP)
  68.  *  if bitspergun=32, colortable is ULONG guns of RGBRGB etc.
  69.  *     Only the high eight bits of each gun will be written to CMAP.
  70.  *     Four bit guns n will be saved as nn
  71.  *
  72.  * The struct Chunk *chunklist is for chunks you wish written
  73.  * other than BMHD, CMAP, and CAMG (they will be screened out)
  74.  * because they are calculated and written separately
  75.  *
  76.  * Returns 0 for success, or an IFFERR
  77.  */
  78. LONG saveilbm(struct ILBMInfo *ilbm,
  79.         struct BitMap *bitmap, ULONG modeid,
  80.         WORD width, WORD height, WORD pagewidth, WORD pageheight,
  81.         APTR colortable, UWORD ncolors, UWORD bitspergun,
  82.         WORD masking, WORD transparentColor,
  83.         struct Chunk *chunklist1, struct Chunk *chunklist2,
  84.         UBYTE *filename)
  85. {
  86. struct IFFHandle *iff;
  87. struct Chunk *chunk;
  88. ULONG chunkID;
  89. UBYTE *bodybuf;
  90. LONG size, error = 0L;
  91. #define BODYBUFSZ    4096
  92.  
  93.     iff = ilbm->ParseInfo.iff;
  94.  
  95.     if(!(modeid & 0xFFFF0000))    modeid &= OLDCAMGMASK;
  96.  
  97.     if(!(bodybuf = AllocMem(BODYBUFSZ,MEMF_PUBLIC)))
  98.     {
  99.     message(SI(MSG_IFFP_NOMEM));
  100.     return(IFFERR_NOMEM);
  101.     }
  102.  
  103.     if(!(error = openifile(ilbm, filename, IFFF_WRITE)))
  104.     {
  105.     D(bug("Opened %s for write\n",filename));
  106.  
  107.     error = PushChunk(iff, ID_ILBM, ID_FORM, IFFSIZE_UNKNOWN);
  108.  
  109.     D(bug("After PushChunk FORM ILBM - error = %ld\n", error));
  110.  
  111.         initbmhd(&ilbm->Bmhd, bitmap, masking, cmpByteRun1, transparentColor,
  112.                     width, height, pagewidth, pageheight, modeid);
  113.  
  114.     D(bug("Error before putbmhd = %ld\n",error));
  115.  
  116.     CkErr(putbmhd(iff,&ilbm->Bmhd));    
  117.  
  118.     if(colortable)    CkErr(putcmap(iff,colortable,ncolors,bitspergun));
  119.  
  120.     ilbm->camg = modeid;
  121.     D(bug("before putcamg - error = %ld\n",error));
  122.     CkErr(putcamg(iff,&modeid));
  123.  
  124.     D(bug("Past putBMHD, CMAP, CAMG - error = %ld\n",error));
  125.  
  126.     /* Write out chunklists 1 & 2 (if any), except for
  127.      * any BMHD, CMAP, or CAMG (computed/written separately)
  128.      */
  129.     for(chunk = chunklist1; chunk; chunk = chunk->ch_Next)
  130.         {
  131.         D(bug("chunklist1 - have a %.4s\n",&chunk->ch_ID));
  132.         chunkID = chunk->ch_ID;
  133.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  134.         {
  135.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  136.             strlen(chunk->ch_Data) : chunk->ch_Size;
  137.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  138.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  139.         }
  140.         }
  141.  
  142.     for(chunk = chunklist2; chunk; chunk = chunk->ch_Next)
  143.         {
  144.         chunkID = chunk->ch_ID;
  145.         D(bug("chunklist2 - have a %.4s\n",&chunk->ch_ID));
  146.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  147.         {
  148.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  149.             strlen(chunk->ch_Data) : chunk->ch_Size;
  150.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  151.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  152.         }
  153.         }
  154.  
  155.     /* Write out the BODY
  156.      */
  157.     CkErr(putbody(iff, bitmap, NULL, &ilbm->Bmhd, bodybuf, BODYBUFSZ));
  158.  
  159.     D(bug("Past putbody - error = %ld\n",error));
  160.  
  161.  
  162.     CkErr(PopChunk(iff));    /* close out the FORM */
  163.     closeifile(ilbm);    /* and the file */
  164.     }
  165.  
  166.     FreeMem(bodybuf,BODYBUFSZ);
  167.  
  168.     return(error);
  169. }
  170.  
  171.